/**
 * Functor 函子
 */

// class Container {
//   // 函子内部维护一个值，不对外公布
//   constructor (value) {
//     this._value = value
//   }

//   // 接收一个处理值的函数，返回一个新的函子
//   map (fn) {
//     return new Container(fn(this._value))
//   }
// }

// const res = new Container(5).map(x => x + 1)
//   .map(x => x * x)
// console.log(res)

class Container<T> {
  static of <T>(value: T): Container<T> {
    return new Container(value)
  }

  private _value: T
  // 函子内部维护一个值，不对外公布
  constructor (value: T) {
    this._value = value
  }

  // 接收一个处理值的函数，返回一个新的函子
  map (fn: (value: T) => T): Container<T> {
    return Container.of(fn(this._value))
  }
}

const res = Container.of(5)
  .map(x => x + 1)
  .map(x => x * x)
console.log(res)

// Functor不小心传入空值时可能会出现问题
// const res = Container.of(null)
//   .map(x => x.toUpperCase())
// console.log(res)

export {}
